package com.zatech.cgnci.project.base.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.zatech.cgnci.project.base.serializer.LocalDateTimeSerializer;

import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;


public class FastJsonUtils {

    private static SerializeConfig sc = new SerializeConfig();

    //======================================= 转 Json字符串 ==============================================

    public static String toJSONString(Object object) {
        sc.put(Date.class, new SimpleDateFormatSerializer(DateUtils.FORMAT_2)); // 日期格式处理
        sc.put(BigInteger.class, ToStringSerializer.instance);
        sc.put(Long.class, ToStringSerializer.instance);
        sc.put(Long.TYPE, ToStringSerializer.instance);
        sc.put(LocalDateTime.class, LocalDateTimeSerializer.instance);//@JSONField注解会失效，仅限于LocalDateTime类

        return JSONObject.toJSONString(object, sc,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.DisableCircularReferenceDetect);
    }

    /**
     *  将任意对象转为json字符串, 并忽略值为 null的属性（默认）
     */
    public static String toJSONString2(Object object) {
        return JSON.toJSONString(object);
    }

    /**
     *  将任意对象转为json字符串, 并忽略值为null的属性
     */
    public static String toJSONStringNoNull(Object object) {
        return JSON.toJSONString(object, SerializerFeature.PrettyFormat);
    }

    /**
     *  将任意对象转为json字符串转为json字符串, 并保留值为null的属性
     */
    public static String toJSONStringIsNull(Object object) {
        return JSON.toJSONString(object, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
    }


    //========================================== 转 Object ==============================================

    /**
     *  把 JSON字符串转为 Object （接收时可强转任意javaBand）
     */
    public static Object parse(String text) {
        return JSON.parse(text);
    }

    /**
     *  将JavaBean(任意对象) 转换为 Object, （接收时可强转任意javaBand）
     */
    public static Object toJSON(Object javaObject) {
        return JSON.toJSON(javaObject);
    }

    //=========================================  转 JSONObject ==========================================

    /**
     *  把JSON字符串 转为 JSONObject
     */
    public static JSONObject parseObject(String text) {
        return JSON.parseObject(text);
    }

    /**
     *  把JSON字符串 转为 JSONObject
     */
    public static JSONObject parseJSONObject(Object javaObject) {
        return (JSONObject)JSON.toJSON(javaObject);
    }

    //========================================== 转 JSONArray ===========================================

    /**
     *  把JSON字符串 转为 JSONArray
     */
    public static JSONArray parseArray(String text) {
        return JSON.parseArray(text);
    }


    //=========================================== 转 javaBean ===========================================

    /**
     *  把JSON字符串转为JavaBean
     */
    public static <T> T parseObject(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }


    //============================================= 转实体类 ==============================================

    /**
     *  把JSON 字符串转为实体类
     */
    public static <T> T parseEntity(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    /**
     *  将Map 转换为 实体类
     */
    public static <T> T parseEntity(Map map, Class<T> t) {
        String jsons = toJSONStringIsNull(map);
        T t1 = JSON.parseObject(jsons, t);
        return t1;
    }


    //============================================= 转Map ==============================================

    /**
     *  把JSON字符串转为 Map
     */
    public static Map parseMap(String text) {
        return JSON.parseObject(text, Map.class);
    }

    /**
     *  将实体类 转换为  Map
     */
    public static <T> Map parseMap(T t) {
        String jsons = toJSONStringIsNull(t);
        Map paramMap = (Map) JSONObject.parseObject(jsons);
        return paramMap;
    }


    //============================================= 转List ==============================================

    /**
     *  把JSON字符串转为 List
     *
     * @return
     */
    public static List parseList(String text) {
        return JSON.parseObject(text, List.class);
    }

    /**
     *  把JSON 字符串转为 List<Entity/Map/List>  ==>  List<任意对象>
     */
    public static <T> List<T> parseList(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz);
    }

}
